return X86EMUL_OKAY;
}
+static int handle_pvh_io(
+ int dir, uint32_t port, uint32_t bytes, uint32_t *val)
+{
+ struct vcpu *curr = current;
+ struct cpu_user_regs *regs = guest_cpu_user_regs();
+
+ if ( dir == IOREQ_WRITE )
+ guest_io_write(port, bytes, *val, curr, regs);
+ else
+ *val = guest_io_read(port, bytes, curr, regs);
+
+ return X86EMUL_OKAY;
+}
+
int hvm_domain_initialise(struct domain *d)
{
int rc;
d->arch.hvm_domain.io_handler->num_slot = 0;
if ( is_pvh_domain(d) )
+ {
+ register_portio_handler(d, 0, 0x10003, handle_pvh_io);
return 0;
+ }
hvm_init_guest_time(d);
return 1;
}
-static uint32_t guest_io_read(
+uint32_t guest_io_read(
unsigned int port, unsigned int bytes,
struct vcpu *v, struct cpu_user_regs *regs)
{
return data;
}
-static void guest_io_write(
+void guest_io_write(
unsigned int port, unsigned int bytes, uint32_t data,
struct vcpu *v, struct cpu_user_regs *regs)
{
extern int send_guest_trap(struct domain *d, uint16_t vcpuid,
unsigned int trap_nr);
+uint32_t guest_io_read(unsigned int port, unsigned int bytes,
+ struct vcpu *, struct cpu_user_regs *);
+void guest_io_write(unsigned int port, unsigned int bytes, uint32_t data,
+ struct vcpu *, struct cpu_user_regs *);
+
#endif /* ASM_TRAP_H */